<?php
	/**
	*	分页类
	*	eg:
	*	$paginationObj->getOffset(10,'index_news','id');
	*	echo "<ul id='pagination'>";
	*	$paginationObj->showpage(5);
	*	echo "</ul>";
	*	一定要在ul的li属性里面加上float:left; 让分页横排
	*/

	//继承自数据库操作类
	class Pagination{

		private $nexepage,$lastpage,$res,$showi,$maxi; //定义一些私有属性。
		public $show,$page,$pagenum,$total;
		
		//取得当前的?page参数的值
		private function getpage(){
			return $this->page=isset($_GET['page'])?intval($_GET['page']):1;
		}

		//取得总的页数 $table = 要取得的表。$field = 通过$field字段来取。$num = 每页要显示多少条数据
		private function getpagenum($table,$field,$num){
            global $DB;
			$this->res=$DB->getquery("SELECT $field FROM $table");
			$this->total=mysqli_num_rows($this->res);
			@$this->pagenum=ceil($this->total/$num);
		}
		//取得limit第一个参数offset的值 三个参数分别为 每页要显示的数据，分页要显示数据所在的，可以取得总数的字段名
		public function getoffset($num,$table,$field){
			//取得page参数的值
			$this->getpage();
			//调用取得总页数的方法
			$this->getpagenum($table,$field,$num);
			return ($this->page-1)*$num;
		}
		/**
		*
		*显示分页的方法，参数是分页那里要显示多少个页
		*
		*显示的格式是<ul>格式
		*/
		public function showpage($shownum){
			$request_uri = explode('&',$_SERVER['REQUEST_URI']);
			if(isset($_GET)&&$_GET!=''){
				if($this->page>1){	//显示上一页和首页
					$this->lastpage=$this->page-1;
					$this->show.="<li class='nextpage'><a href='{$request_uri[0]}&page=1'><<首页</a></li>";
					$this->show.="<li class='nextpage'><a href='{$request_uri[0]}&page=$this->lastpage'><上一页</a></li>";
				}
				//循环变量$i的初始值
				$this->showi=$this->page-(($shownum-1)/2)>0?ceil($this->page-(($shownum-1)/2)):1;
				//$i的最大值
				$this->maxi=$shownum+$this->showi<=$this->pagenum?$shownum:$this->pagenum;
				//如果最大页-$i < 要显示的页 $i的初始值为最大页-显示多少页-1 也就是说在最后面几页的时候。 前边的页不会隐藏。
				if($this->maxi-$this->showi<$shownum){
					$this->showi=$this->maxi-ceil($shownum-1);
				}
				//防止出现错误 所以有了下面三行。
				//如果$i<0; 让$i=1;防止出现负数的页数
				$this->showi=$this->showi<=0?1:$this->showi;
				//如果$i的最大值小于要显示的页。 那么让$i的最大值等于要显示的页。
				$this->maxi=$this->maxi<$shownum?$shownum:$this->maxi;
				//如果总的页数小于要显示的页数 那么 只显示总有的页数 防止出现超过需要的页数
				$this->maxi=$this->pagenum<$shownum?$this->pagenum:$this->maxi;
				//循环输出分页
				for($i=$this->showi;$i<=$this->maxi;$i++){
					    //如果当前页等于最大页。 显示最后一页并跳出循环
						if($this->page==$this->pagenum){
							$this->show.="<li class='page'>$this->page</li>";
							break;
						}
						//如果$i不等于当前页 则显示链接 也就是说当前页不会显示为链接 除了当前页之外的显示为链接
						if($i!=$this->page){
							$this->show.="<li class='href'><a href='{$request_uri[0]}&page=$i'>$i</a></li>";
						}else{	//当前页 直接显示$i
							$this->show.="<li class='page'>$i</li>";
						}
					}
					//如果 当前页看不到最后页。。显示... 表示后面还有
				if($this->page<$this->pagenum-ceil(($shownum-1)/2)){
						$this->show.="<li style='line-height:20px;vertical-align:bottom;margin-top:5px;'>. . .</li>";
				}
				//下面是显示下一页和 最后页。
				if($this->pagenum>1){
					$this->nextpage=$this->page+1;
					if($this->nextpage<=$this->pagenum){
						$this->show.="<li class='nextpage'><a href='{$request_uri[0]}&page=$this->nextpage'>下一页></a></li>";
						$this->show.="<li class='nextpage'><a href='{$request_uri[0]}&page=$this->pagenum'>末页>></a></li>";
					}
				}
			}else{
				if($this->page>1){	//显示上一页和首页
					$this->lastpage=$this->page-1;
					$this->show.="<li class='nextpage'><a href='?page=1'><<首页</a></li>";
					$this->show.="<li class='nextpage'><a href='?page=$this->lastpage'><上一页</a></li>";
				}
				//循环变量$i的初始值
				$this->showi=$this->page-(($shownum-1)/2)>0?ceil($this->page-(($shownum-1)/2)):1;
				//$i的最大值
				$this->maxi=$shownum+$this->showi<=$this->pagenum?$shownum:$this->pagenum;
				//如果最大页-$i < 要显示的页 $i的初始值为最大页-显示多少页-1 也就是说在最后面几页的时候。 前边的页不会隐藏。
				if($this->maxi-$this->showi<$shownum){
					$this->showi=$this->maxi-ceil($shownum-1);
				}
				//防止出现错误 所以有了下面三行。
				//如果$i<0; 让$i=1;防止出现负数的页数
				$this->showi=$this->showi<=0?1:$this->showi;
				//如果$i的最大值小于要显示的页。 那么让$i的最大值等于要显示的页。
				$this->maxi=$this->maxi<$shownum?$shownum:$this->maxi;
				//如果总的页数小于要显示的页数 那么 只显示总有的页数 防止出现超过需要的页数
				$this->maxi=$this->pagenum<$shownum?$this->pagenum:$this->maxi;
				//循环输出分页
				for($i=$this->showi;$i<=$this->maxi;$i++){
					    //如果当前页等于最大页。 显示最后一页并跳出循环
						if($this->page==$this->pagenum){
							$this->show.="<li class='page'>$this->page</li>";
							break;
						}
						//如果$i不等于当前页 则显示链接 也就是说当前页不会显示为链接 除了当前页之外的显示为链接
						if($i!=$this->page){
							$this->show.="<li class='href'><a href='?page=$i'>$i</a></li>";
						}else{	//当前页 直接显示$i
							$this->show.="<li class='page'>$i</li>";
						}
					}
					//如果 当前页看不到最后页。。显示... 表示后面还有
				if($this->page<$this->pagenum-ceil(($shownum-1)/2)){
						$this->show.="<li style='line-height:20px;vertical-align:bottom;margin-top:5px;'>. . .</li>";
				}
				//下面是显示下一页和 最后页。
				if($this->pagenum>1){
					$this->nextpage=$this->page+1;
					if($this->nextpage<=$this->pagenum){
						$this->show.="<li class='nextpage'><a href='?page=$this->nextpage'>下一页></a></li>";
						$this->show.="<li class='nextpage'><a href='?page=$this->pagenum'>末页>></a></li>";
					}
				}
			}
		}
	}
?>
